package com.kjzy.controller;

import com.github.pagehelper.PageInfo;
import com.kjzy.pojo.Parameter;
import com.kjzy.pojo.User;
import com.kjzy.service.ParameterService;
import com.kjzy.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpSession;
import java.io.File;
import java.util.Date;
import java.util.List;

//定义表示层的控制器实现类：使用@Controller注解，将该类定义成表示层的控制器 bean。
@Controller
public class UserController {
    // 使用@Autowired注解告诉IoC容器，需要由容器来创建名为userService的
    // 业务逻辑层bean对象，并依赖注入到本对象的userService属性上。
    @Autowired
    private UserService userService;

    @Autowired
    private ParameterService parameterService;


    // 使用@RequestMapping注解，将http请求与处理方法对应起来：当请求名为
    // admin_login的资源的时候，将调用toAdminLogin()方法跳转到管理员登录页面。
    @RequestMapping(value = "/admin_login")
    public String toAdminLogin() {
        // 1. 返回待跳转的逻辑视图名。本例中，
        // 将跳转到"/WEB-INF/jsp/admin/admin_login.jsp"。
        return "admin/admin_login";
    }


    // 使用@RequestMapping注解，将http请求与处理方法对应起来：当请求名为
    // admin_main的资源的时候，将调用toAdminMain()方法跳转到管理员主操作页面。
    @RequestMapping(value = "/admin_main")
    public String toAdminMain() {
        // 1. 返回待跳转的逻辑视图名。本例中，
        // 将跳转到"/WEB-INF/jsp/admin/admin_main.jsp"。
        return "admin/admin_main";
    }
    @RequestMapping(value = "/yonghu_main")
    public String toUserMain() {
        // 1. 返回待跳转的逻辑视图名。本例中，
        // 将跳转到"/WEB-INF/jsp/admin/admin_main.jsp"。
        return "admin/yonghu_main";
    }
    // 使用@PostMapping注解，将http请求与处理方法对应起来：当以POST方式请求
    // 名为adminLogin.action的资源的时候，将调用adminLogin()方法进行管理员登
    // 录处理。
//    相当于 @RequestMapping(value = "/adminLogin.action",method = RequestMethod.POST)
    @PostMapping(value ="/adminLogin.action")
    public String adminLogin(Integer userId, String password,
                             Model model, HttpSession session){
        //1.将用户在页面上输入的用户id和密码，自动绑定到形参userId和password上。
        // 2. 使用(用户在页面上输入的)用户id和密码，调用service层的方法，
        // 判断管理员用户是否能成功登录。
        User admin = userService.findAdmin(userId, password);
        if(admin!=null){

            // 3-1.将用户对象添加到Session中
            session.setAttribute("ADMIN_SESSION", admin);
            if (admin.getRole().equals("超级用户")) {
                // 3-2.以重定向的方式，跳转到管理员的管理主页
                // 面"/WEB-INF/jsp/admin/admin_main.jsp"。
                return "redirect:admin_main";
            } else {
                // 3-2.以重定向的方式，跳转到管理员的管理主页
                // 面"/WEB-INF/jsp/admin/admin_main.jsp"。
                // return "redirect:user_main";
                return "redirect:yonghu_main";
            }
        }
        // 3-1.将登录失败的信息，写入到model对象里
        model.addAttribute("msg","管理员账号或密码错误，请重新输入！");
        return "admin/admin_login";
    }
//注销
    @RequestMapping("/logout")
      public String logout(HttpSession session){
        session.invalidate();
        return "redirect:admin_login";
      }

    // 使用@RequestMapping注解，将http请求与处理方法对应起来：当请求
// 名为user_manage的资源的时候，将调用toUserManage()方法跳转到用户管理页面。
    @RequestMapping(value = "/user_manage")
    public String toUserManage(Model model) {
        // 1. 返回待跳转的逻辑视图名。本例中，将跳转
        // 到"/WEB-INF/jsp/admin/user_manage.jsp"。
        // 添加共享的角色和状态列表
        addParameterListsToModel(model);

        return "admin/user_manage";
    }
    // 统一获取用户角色列表和用户状态列表
    private void addParameterListsToModel(Model model) {
        // 获取用户角色列表
        List<Parameter> roles = parameterService.getParametersByType("role");
        model.addAttribute("roles", roles);

        // 获取用户状态列表
        List<Parameter> states = parameterService.getParametersByType("state");
        model.addAttribute("states", states);
    }
    // 分页查询用户
    @RequestMapping(value = "listUser.action")
    public String list(User user, @RequestParam(defaultValue = "1") int pageNum,
                       @RequestParam(defaultValue = "10") int pageSize,
                       Model model) {

        System.out.println("controller:pageNum:"+pageNum);
        System.out.println("controller:pageSize:"+pageSize);
        // 使用分页插件进行查询，返回分页结果
        PageInfo<User> pageInfo = userService.findUserList(user, pageNum, pageSize);

        // 将分页信息存入Model中，供视图使用
        model.addAttribute("userList", pageInfo.getList());  // 用户列表
        model.addAttribute("pageInfo", pageInfo);  // 分页信息，包含页码、总记录数等
        // 添加共享的角色和状态列表
        addParameterListsToModel(model);
        // 返回视图
        return "admin/user_manage";
    }

    // 使用@RequestMapping注解，将http请求与处理方法对应起来：当
// 请求名为createUser.action的资源的时候，将调用createUser()方法。
    @RequestMapping(value = "/createUser.action", method = RequestMethod.POST)
    @ResponseBody
    public String createUser(@RequestParam("username") String username,
                             @RequestParam("password") String password,
                             @RequestParam("gender") String gender,
                             @RequestParam("email") String email,
                             @RequestParam("telephone") String telephone,
                             @RequestParam("introduce") String introduce,
                             @RequestParam("role") String role) throws Exception {

        // 1. 创建用户对象
        User user = new User();
        user.setUsername(username);
        user.setPassword(password);
        user.setGender(gender);
        user.setEmail(email);
        user.setTelephone(telephone);
        user.setIntroduce(introduce);
        user.setRole(role);
        user.setState(2);  // 设置为非激活状态


        String result = userService.createUser(user);

        // 4. 返回(新增用户的)结果，不是跳转到新页面。
        // 本例中，返回的不是一段JSON数据，就是一个普通的String数据("SUCCESS"
        // 或错误提示信息)。 但是，需要在方法上添加@ResponseBody注解。如果不添加该
        // 注解，SpringMVC会将待返回的String数据，误认为是待跳转新页面的路径值，即
        // 会误认为要跳转到/WEB-INF/jsp/SUCCESS.jsp或其它jsp页面。
        return result;

    }

    // 使用@RequestMapping注解，将http请求与处理方法对应
// 起来：当请求名为findUserById.action的资源的时候，将调用findUserById()方法。
    @RequestMapping("/findUserById.action")
// getUserById方法的返回值是User对象，在该方法上加上@ResponseBody注
// 解后，表示将User对象转换成json数据，然后发送给客户端。
    @ResponseBody
    public User findUserById(@RequestParam(value = "id") Integer id) {

        // 1.数据自动绑定。
        //  将客户端http请求中包含的用户id，自动绑定到形参id上。

        // 2. 调用service层的方法实现：根据用户ID查询用户记录。
        User user = userService.findUserById(id);

        // 3.返回User对象。SpringMVC负责将User对象转换成json数据，然后发送给客户端。
        return user;
    }
    // 使用@RequestMapping注解，将http请求与处理方法对应
// 起来：当请求名为updateUser.action的资源的时候，将调用updateUser()方法。
    @RequestMapping("/updateUser.action")
    @ResponseBody
    public String updateUser(@RequestBody User user) {

        // 1. 数据自动绑定。
        // 本例中，客户端使用ajax方式提交json数据，因此，必须使用@RequestBody注解，
        // 才能将客户端http请求中的json数据，自动绑定到形参user上。

        // 2. 调用service层的方法实现：更新用户记录。
        String result = userService.updateUser(user);

        // 3. 返回(修改用户的)结果，不是跳转到新页面。
        // 本例中，返回的不是一段JSON数据，就是一个普通的String数据("SUCCESS"
        // 或错误提示信息)。 但是，需要在方法上添加@ResponseBody注解。如果不添加该
        // 注解，SpringMVC会将待返回的String数据，误认为是待跳转新页面的路径值，即
        // 会误认为要跳转到/WEB-INF/jsp/SUCCESS.jsp或其它jsp页面。
        return result;

    }

    // 使用@RequestMapping注解，将http请求与处理方法对应
// 起来：当请求名为deleteUser.action的资源的时候，将调用deleteUser()方法。
    @RequestMapping("/deleteUser.action")
    @ResponseBody
    public String deleteUser(@RequestParam(value = "id") Integer id) {

        // 1. 将客户端http请求中的json数据，自动绑定到形参id上。

        // 2. 调用service层的方法实现：删除用户记录。
        String result = userService.deleteUser(id);

        // 3. 返回(删除用户的)结果，不是跳转到新页面。
        // 本例中，返回的不是一段JSON数据，就是一个普通的String数据("SUCCESS"
        // 或错误提示信息)。 但是，需要在方法上添加@ResponseBody注解。如果不添加该
        // 注解，SpringMVC会将待返回的String数据，误认为是待跳转新页面的路径值，即
        // 会误认为要跳转到/WEB-INF/jsp/SUCCESS.jsp或其它jsp页面。
        return result;

    }


}


